package nbcp.db.redis.proxy

import io.lettuce.core.RedisClient
import io.lettuce.core.api.sync.RedisCommands
import io.lettuce.core.codec.ByteArrayCodec
import io.lettuce.core.codec.RedisCodec
import io.lettuce.core.codec.Utf8StringCodec
import org.springframework.data.redis.core.RedisTemplate
import nbcp.base.comm.JsonMap
import nbcp.base.comm.StringMap
import nbcp.base.extend.*
import nbcp.base.utils.SpringUtil
import nbcp.db.redis.RedisConfig
import nbcp.db.redis.rer
import java.io.Serializable
import java.nio.ByteBuffer

/**
 * Created by udi on 17-7-14.
 */
class RedisStringProxy(
        collectionName: String,
        dbOffset: Int = 0,
        var defaultCacheSeconds: Int = 0) : BaseRedisVarKeyProxy(dbOffset, collectionName) {

    fun get(key: String = ""): String {
        var cacheKey = arrayOf(collectionName, key).filter { it.isNotEmpty() }.joinToString(":")
        var value = redis.stringCommand(dbOffset) { it.get(cacheKey) }
        if (value == null) return "";
        return value
    }

    fun set(key: String, value: String, cacheKeySeconds: Int = 0): String {
        var cs = cacheKeySeconds.AsInt(defaultCacheSeconds);

        var cacheKey = arrayOf(collectionName, key).filter { it.isNotEmpty() }.joinToString(":")

        if (cs > 0) {
            return redis.stringCommand(dbOffset) { it.setex(cacheKey, cs.toLong(), value) }
        } else {
            return redis.stringCommand(dbOffset) { it.set(cacheKey, value); }
        }
    }

    fun set(value: String, cacheKeySeconds: Int = 0) = set("", value, cacheKeySeconds)

    fun incr(key: String = ""): Long {
        var cacheKey = arrayOf(collectionName, key).filter { it.isNotEmpty() }.joinToString(":")
        if (cacheKey.isEmpty()) return -1L

        return redis.stringCommand(dbOffset) { it.incr(cacheKey) }
    }

    fun decr(key: String = ""): Long {
        var cacheKey = arrayOf(collectionName, key).filter { it.isNotEmpty() }.joinToString(":")
        if (cacheKey.isEmpty()) return -1L

        return redis.stringCommand(dbOffset) { it.decr(cacheKey) }
    }
}


//class RedisStringIntCodec private constructor() : RedisCodec<String, Int> {
//
//    companion object {
//        val INSTANCE = RedisStringIntCodec()
//    }
//
//    override fun decodeKey(bytes: ByteBuffer): String {
//        return String(bytes.array())
//    }
//
//    override fun encodeValue(value: Int): ByteBuffer {
//        var list = mutableListOf<Byte>()
//        var value = value;
//
//        list.add((value and 0xFF) as Byte)
//        value ushr 8
//        list.add((value and 0xFF) as Byte)
//        value ushr 8
//        list.add((value and 0xFF) as Byte)
//        value ushr 8
//        list.add((value and 0xFF) as Byte)
//
//        return ByteBuffer.wrap(list.toByteArray())
//    }
//
//    override fun encodeKey(key: String): ByteBuffer {
//        return ByteBuffer.wrap(key.toByteArray())
//    }
//
//    override fun decodeValue(bytes: ByteBuffer): Int {
//        var list = mutableListOf<Byte>()
//        var value = bytes.array()
//
//        var ret = 0;
//        for (i in 0..3) {
//            ret = ret or (value.get(i).toInt() shl i)
//        }
//        return ret;
//    }
//
//}


//操作的是某一个 Key
//open class RedisHashProxy(
//        var collectionName: String,
//        var dbOffset: Int = 0) {
//
//    fun getAll(): StringMap {
//        var value = redis.hgetall(collectionName);
//
//        if (value == null) return StringMap();
//        return StringMap(value)
//    }
//
//
//    fun get(field: String): String {
//        var value = redis.hget(collectionName, field);
//
//        if (value == null) return "";
//        return value
//    }
//
//    /**
//     *追加方式设置,hmset
//     */
//    fun set(value: StringMap, cacheKeySeconds: Int = 0): String {
//        var cs = cacheKeySeconds.AsInt(defaultCacheSeconds);
//
//
//        var ret = redis.hmset(collectionName, value);
//
//        if (cs > 0) {
//            redis.expire(collectionName, cs.toLong());
//        }
//        return ret;
//    }
//
//
//    fun incr(field: String, step: Int = 1): Long = redis.hincrby(collectionName, field, step.toLong())
//
//    fun hdel(vararg field: String): Long = redis.hdel(collectionName, *field)
//
//    fun hkeys(): List<String> {
//        return redis.hkeys(collectionName)
//    }
//
//    fun hsetnx(field: String, value: String) = redis.hsetnx(collectionName, field, value)
//}


